from rest_framework import serializers

from apps.inform.models import Inform,InformRead
from apps.oaauth.serializers import UserSerializer,DepartmentSerializer#导入已定义的序列化：序列化嵌套
from apps.oaauth.models import OADepartment

class InformReadSerializer(serializers.ModelSerializer):
    class Meta:
        model = InformRead
        fields = '__all__'
class InformSerializer(serializers.ModelSerializer):
    author = UserSerializer(read_only=True)
    departments = DepartmentSerializer(many=True,read_only=True)
    #department_ids一个包含了部门id的列表，后端要接收列表，就需要用到ListField
    department_ids = serializers.ListField(write_only=True) #写入时使用，读取时不包含（从数据库读取返回该对象时，这个字段不会返回）
    reads = InformReadSerializer(many=True,read_only=True)  #会在从模型实例获取数据时被包含在响应中，但是客户端不能通过请求来直接设置这个字段
    #reads展示了哪些用户阅读了该通知以及阅读的相关信息
    class Meta:
        model = Inform
        fields = '__all__'
        read_only_fields = ('public',)

    #重写保存Inform对象的create方法
    def create(self,validated_data):
        # 将用户上传的部门id序列化之前删除并提取
        department_ids = validated_data.pop('department_ids')
        #department_ids:['0','1','2']
        #request = self.context.get['request'] #request表示客户端发送的信息
        request = self.context.get('request')

        #调用定义函数的方法
        # def toInt(value):
        #     return int(value)
        # map(toInt,department_ids)  #对列表中每个值都做相同操作，可使用map方法
        #lambda方法
        print(department_ids)
        department_ids=list(map(lambda value:int(value),department_ids))  #将列表中每个元素都转化成整形
        if 0 in department_ids: #含0,创建一个公开通知                          #表示序列化其他字段
            inform = Inform.objects.create(public=True,author=request.user,**validated_data)
        else:
            #创建一个私有通知                           #表示id在department_ids中的部门
            departments= OADepartment.objects.filter(id__in=department_ids).all() #提取出id匹配的部门
            #创建一个通知实例
            inform = Inform.objects.create(public=False,author=request.user,**validated_data)
            inform.departments.set(departments) #将提取出的部门集合配置给实例
            inform.save()
        return inform

class ReadInformSerializer(serializers.Serializer):
    inform_pk= serializers.IntegerField(error_messages={'required':'请传入inform的id!'})



